//package com.tjetc._6inner_class;
//
//public class _3AnonymityInnerClass {
//    public static void main(String[] args) {
//        /*
//            匿名内部类是定义在外部类的局部位置，比如方法中，并且没有类名。
//            1. 匿名内部类的基本语法
//                new 类或接口(参数列表) {
//                    类体
//                };
//            2. 匿名内部类既是一个类的定义， 同时它本身也是一个对象，因此从语法上看，它既有定义类的特征，也有创建对象的特征，因此可以调用匿名内部类方法。
//            3. 可以直接访问外部类的所有成员，包含私有的
//            4. 不能添加访问修饰符，因为它的地位就是一个局部变量。
//            5. 作用域：仅仅在定义它的方法或代码块中。
//            6. 匿名内部类---访问---->外部类成员（访问方式：直接访问）
//            7. 外部其他类---不能访问---->匿名内部类（因为匿名内部类地位是一个局部变量）
//            8. 如果外部类和匿名内部类的成员重名时，匿名内部类访问的话，默认遵循就近原则， 如果想访向外部类的成员，则可以使用(外部类名.this.成员)去访问
//
//            匿名内部类的种类： 本质是用来简化开发
//            场景：当我们就想需要一个类去实现一个接口，但是这个类我们只用一次，这个时候就可以通过匿名内部类来简化开发
//            1.基于接口的匿名内部类    使用最多！！！！！
//            2.基于抽象类的匿名内部类
//            3.基于普通类的匿名内部类
//
//         */
//
//        _3AnonymityInnerClass anonymityInnerClass = new _3AnonymityInnerClass();
//        anonymityInnerClass.f();
//        System.out.println(anonymityInnerClass.hashCode());
//
//        // 问题：（1）a引用的编译类型是什么？ A （2）a引用的运行类型是什么？B
////        A a = new B();
////        // 多态
////        a.f();
//        System.out.println("---------------------------------");
//
//        /*
//            class _3AnonymityInnerClass$1 implements A {
//                @Override
//                public void f() {
//                    System.out.println("f方法执行");
//                }
//            }
//         */
//
//        A a1 = new A() {
//            @Override
//            public void f() {
//                System.out.println("f方法执行");
//            }
//        };
//        a1.f();
//        // a1.getClass() : 用来获取在运行时的类型
//        System.out.println("a1.getClass() = " + a1.getClass()); // com.tjetc._6inner_class._3AnonymityInnerClass$1
//
//        // 问题：（1）a1引用的编译类型是什么？ A（2）a1引用的运行类型是什么？_3AnonymityInnerClass$1
////        _3AnonymityInnerClass$1.f(); 在编译期 找不到该对象的
//
//        // 如果有多个匿名内部类JVM会自动进行编号
//        A a2 = new A() {
//            @Override
//            public void f() {
//                System.out.println("f方法执行");
//            }
//        };
//        System.out.println("a2.getClass() = " + a2.getClass()); // _3AnonymityInnerClass$2
//
//
//
//        System.out.println("---------------------------------");
//        D d = new E();
//        d.f();
//
//        /*
//            class _3AnonymityInnerClass$3 extends D {
//                @Override
//                void f() {
//                    System.out.println("d1的f方法执行");
//                }
//
//            }
//         */
//        D d1 = new D() {
//            @Override
//            void f() {
//                System.out.println("d1的f方法执行");
//            }
//        };
//        d1.f();
//        System.out.println("d1.getClass() = " + d1.getClass()); // _3AnonymityInnerClass$3
//
//        System.out.println("---------------------------------");
//         /*
//            class  _3AnonymityInnerClass$4 extends F {
//                @Override
//                void f() {
//                   System.out.println("f的方法执行");
//                }
//
//            }
//         */
//        F f = new F(){
//            @Override
//            void f() {
//                System.out.println("f的方法执行");
//            }
//        };
//        f.f();
//        System.out.println("f.getClass() = " + f.getClass()); // _3AnonymityInnerClass$4
//
//
//        anonymityInnerClass.f1(new A() {
//            @Override
//            public void f() {
//                System.out.println("执行f1");
//            }
//        });
//
//    }
//
//    private int a = 2;
//
//
//
//    void f() {
//        // 根据匿名内部类的定义产生C接口的实现类的对象被把引用给到了c变量
////       C c = new C() {
//        System.out.println(new C() {
//            // 匿名内部类:
//            int a = 1;
//
//            void f() {
//            }
//
//            //            public C(){
//            //
//            //            }
//
//            {
//                System.out.println(a);
//                // 直接访问外部类的属性
//                System.out.println(_3AnonymityInnerClass.this.a);
//                System.out.println(_3AnonymityInnerClass.this.hashCode());
//            }
//
//            class A {
//            }
//
//        }.a);
//
//
////       c.f(); // 因为c 变量编译看左边 c接口中无f方法
//
//    }
//
//    void f1(A a) {
//        // 接口制定流程
//        a.f();
//    }
//
//}
//
//// 接口定义规范 IUserService IUserDao
//interface A {
//    void f();
//}
//
//interface C {
//}
//
////class B implements A {
////
////    @Override
////    public void f() {
////        System.out.println("f执行");
////    }
////}
//
//abstract class D {
//    abstract void f();
//}
//
//class E extends D {
//
//    @Override
//    void f() {
//        System.out.println("E的f方法执行");
//    }
//}
//
//class F {
//    void f(){
//        System.out.println("F的f执行");
//    }
//}